package algo3.algothief.modelo;

import java.util.HashMap;

import org.w3c.dom.Document;
import org.w3c.dom.Element;


public abstract class EsconditeDeLadron extends LugarDePais {
	
	protected static String stringCaracteristico;
	
//-------------------------------------------------------------------------------------
	
	public EsconditeDeLadron() {
		this.pista = new Pista(
			"Cuidado, te estas acercando demasiado...", 
			"Se rumorea que la banda se esconde en algun lugar de la ciudad.", 
			"Todo lo que se es que algo turbio esta sucediendo en la ciudad."
		);
		this.cantidadDeVecesQueSeEntro = 0;
	}

//-------------------------------------------------------------------------------------

	// La descripcion extra es para saber a que pais se refiere dentro del archivo.
	
	// La forma de serializar esta escrita lo mas generica posible.
	public Element serializar(Document doc, String descripcionExtra) {
		Element elementoEscondite = doc.createElement("LugarDePais" + descripcionExtra);
		elementoEscondite.setAttribute("tipoDeLugar", this.verStringCaracteristico());
		
		return elementoEscondite;
	}
		
	public static EsconditeDeLadron hidratar(Document doc, String descripcionExtra) {
		Element elementoLugar = (Element)doc.getElementsByTagName("LugarDePais" + descripcionExtra).item(0);
		String stringCaracteristicoNuevo = elementoLugar.getAttribute("tipoDeLugar");
		
		EsconditeDeLadron esconditeNuevo = EsconditeDeLadron.verEsconditeConStringCaracteristico(stringCaracteristicoNuevo);
				
		return esconditeNuevo;
	}
	
//-------------------------------------------------------------------------------------
	
	protected static HashMap<String, EsconditeDeLadron> crearPosiblesEscondites() {
		HashMap<String, EsconditeDeLadron> posiblesEscondites = new HashMap<String, EsconditeDeLadron>();
		
		EsconditeDeLadron lugarConLadronEscondido = new LugarConLadronEscondido();
		EsconditeDeLadron lugarConLadronQueAcuchilla = new LugarConLadronQueAcuchilla();
		EsconditeDeLadron lugarConLadronQueDispara = new LugarConLadronQueDispara();
		
		posiblesEscondites.put(lugarConLadronEscondido.verStringCaracteristico(), lugarConLadronEscondido);
		posiblesEscondites.put(lugarConLadronQueAcuchilla.verStringCaracteristico(), lugarConLadronQueAcuchilla);
		posiblesEscondites.put(lugarConLadronQueDispara.verStringCaracteristico(), lugarConLadronQueDispara);
		
		return posiblesEscondites;
	}
	
	protected static EsconditeDeLadron verEsconditeConStringCaracteristico(String stringCaracteristicoNuevo) {
		HashMap<String, EsconditeDeLadron> posiblesEscondites = EsconditeDeLadron.crearPosiblesEscondites();
		EsconditeDeLadron escondite = posiblesEscondites.get(stringCaracteristicoNuevo);
		
		return escondite;
	}

//-------------------------------------------------------------------------------------
	
	public abstract boolean verSiSeEscondioElLadron();
	
	protected abstract String verStringCaracteristico();
}
